# -*- coding:utf-8 -*-

# author: firstoneyuan
# email: devops_yj@163.com

"""
# 1. 打印一个边长为n的正方形
# 2. 求100内所有奇数的和
# 3. 成绩问题
# 4. 求1到5阶乘之和
# 5. 求素数
# 6. 质数筛法
"""


# 1. 打印一个边长为n的正方形
"""
n = 5
print('*'*n)
for i in range(n-2):
    print('*'+' '*(n-2)+'*')
print('*'*n)

'''
边为3,则 -1 0 1 => range(1,2)
边为4,则-2-1 0 1 => range(-2,2)
边为5, 则-2-1 0 1 2 => range(-2,3)
'''
n = 5
e = -n//2
for i in range(e,n+e):
    if i == e or i == n+e-1:
        print('*'*n)
    else:
        print('*' + ' '*(n-2) + '*')

# 上面代码等价于下面代码:
n = 5
for i in range(n):
    if i == 0 or i == n-1:
        print('*'*n)
    else:
        print('*'+' '*(n-2) + '*')


# 2. 求100内所有奇数的和
sum = 0
for i in range(1,100,2):
    sum += i 

print(sum)


# 4. 求1到5阶乘之和
# 方法1
n = 5
sum = 0
for i in range(1,n+1):
    tmp = 1
    for j in range(1,i+1):
        tmp *= j
    sum += tmp 
print(sum)


# 方法2
nums = 1
x = 0
for n in range(1,6):
    nums *= n 
    x += nums
print(x)
"""


# 5. 求素数
# 质数： 一个数只能被1和它本身整除
# 方法1：按照定义来，假设有一个数n(n>1),从2开始判断，一直判断到n-1
n = 12577 # 避开3,5,10,2的倍数
# 对这个数从2开始测试到n-1
flag = False
for i in range(2,n):
    if n % i == 0: # 找到条件是什么
        flag = True
        print(i)
        break

if flag:
    print(n,'is not a prime number')
else:
    print(n,'is a prime number')

# 与2 取模,就可以直接判断它是否是一个偶数.

# 使用else子句
n = 12577   # 避开3,5,10,2的倍数
# 对这个数从2开始测试到n-1
flag = False
for i in range(2,n):
    if n % i == 0: #找到条件是什么.
        print(n,'is not a prime number')
        break
else:
    print(n,'is a prime number')


# 6. 质数筛法
n = 100000
p = [True] * (n + 1) # 为了方便使用n+1，使索引和数字对齐
p[0] = p[1] = False
for i in range(2, int(n ** 0.5 + 1.5)):
    if not p[i]:
        continue
    for j in range(i * i, n + 1, i): # 如果2是，则2的倍数都不是，因此，因此步长都是i。全部覆盖一遍
        p[j] = False
primes = [i for i in range(n + 1) if p[i]]

print(len(primes))
#print(primes)

#36 = 6*6 = 4*9 也就是4的9倍，9的4倍，6的6倍

